home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Contributed / SpriteWorld / SpriteWorld Files / BlitPixie / Sources / BlitPixieClear.c < prev    next >
Encoding:
Text File  |  2000-10-06  |  4.4 KB  |  240 lines  |  [TEXT/CWIE]

  1. ///--------------------------------------------------------------------------------------
  2. //    BlitPixieClear - color fill blitter
  3. //
  4. //    written by Anders F Björklund <afb@algonet.se>
  5. //    ©1999 afb.
  6. ///--------------------------------------------------------------------------------------
  7.  
  8. #ifndef __BLITPIXIE__
  9. #include "BlitPixieHeader.h"
  10. #endif
  11.  
  12. #include "BlitPixieAsm.h"
  13.  
  14. #pragma mark *** PowerPC asm : 
  15. #if USE_PPC_ASSEMBLY
  16.  
  17. //    NOTE:    assumes dstRowBytes is multiple of 4 (for alignment purposes)
  18. //    NOTE:    assumes bytes, rows > 0
  19.  
  20. ASM_FUNC void BlitPixieClear(
  21.     register unsigned char *dst,            // r3
  22.     register unsigned long dstRowBytes,        // r4
  23.     register unsigned short bytes,            // r5
  24.     register unsigned short rows,            // r6
  25.     register unsigned long clear )            // r7
  26. {
  27. #define    r_dst            r3
  28. #define    r_dstRowBytes    r4
  29. #define    r_bytes            r5
  30. #define    r_rows            r6
  31. #define    r_clear            r7
  32.  
  33. #define    r_dstStride        r31
  34. #define    r_y                r30
  35. #define    r_align            r29
  36. #define    r_chunks        r29
  37. #define    r_leftover        r28
  38. #define    r_offset        r0
  39.  
  40. #define    kRegisterSaveStack    (4 * 4)
  41.  
  42.     ASM_BEGIN
  43.     stmw         r28,-kRegisterSaveStack(SP)
  44.     
  45.     stw            r_clear,-(kRegisterSaveStack+8)(SP)
  46.     stw            r_clear,-(kRegisterSaveStack+4)(SP)
  47.     
  48.     sub            r_dstStride,r_dstRowBytes,r_bytes
  49.  
  50.         // alignment offset (dst & 7)
  51.     neg            r_align,r_dst
  52.     rlwinm        r_align,r_align,0,29,31
  53.     cmplw        r_align,r_bytes
  54.     ble            @alignok
  55.     mr            r_align,r_bytes
  56. @alignok:
  57.     sub            r_bytes,r_bytes,r_align
  58.  
  59.     rlwinm        r_align,r_align,8,20,23
  60.     mtcrf        4,r_align    // cr5
  61.     
  62.     rlwinm        r_chunks,r_bytes,27,5,31
  63.     rlwinm        r_leftover,r_bytes,0,27,31
  64.  
  65.     subi        r_dst,r_dst,32
  66.     li            r_offset,32
  67.     
  68.     mr            r_y,r_rows
  69.     mtxer        r_leftover
  70.  
  71.     lfd            fp0,-(kRegisterSaveStack+8)(SP)
  72.     
  73.     cmplwi        cr6,r_chunks,0
  74.     cmplwi        cr7,r_leftover,0
  75.     
  76.     mr            r5,r_clear
  77.     mr            r6,r_clear
  78.     mr            r7,r_clear
  79.     mr            r8,r_clear
  80.     mr            r9,r_clear
  81.     mr            r10,r_clear
  82.     mr            r11,r_clear
  83.     mr            r12,r_clear
  84.     
  85. @yloop1:
  86.         
  87.         // align to double boundary
  88.         bns        cr5,@skipalignByte1
  89.         stb        r_clear,32(r_dst)
  90.         addi    r_dst,r_dst,1
  91.     @skipalignByte1:
  92.         bne        cr5,@skipalignWord1
  93.         sth        r_clear,32(r_dst)
  94.         addi    r_dst,r_dst,2
  95.     @skipalignWord1:
  96.         bng        cr5,@skipalignLong1
  97.         stw        r_clear,32(r_dst)
  98.         addi    r_dst,r_dst,4
  99.     @skipalignLong1:
  100.  
  101.         // copy 32 byte blocks (using doubles)
  102.         beq         cr6,@skiploop1
  103.         mtctr     r_chunks
  104.     @loop1:    
  105.         stfdu    fp0,32(r_dst)
  106.         stfd     fp0,8(r_dst)
  107.         stfd     fp0,16(r_dst)
  108.         stfd     fp0,24(r_dst)
  109.         bdnz     @loop1
  110.     @skiploop1:
  111.  
  112.     subic.        r_y,r_y,1
  113.     
  114.         // copy left-over bytes (<32)
  115.         beq        cr7,@skipleftover1
  116.         stswx    r5,r_dst,r_offset
  117.         add        r_dst,r_dst,r_leftover
  118.     @skipleftover1:
  119.     
  120.     add            r_dst,r_dst,r_dstStride
  121.     
  122.     bne            @yloop1
  123.  
  124.     lmw            r28,-kRegisterSaveStack(SP)    
  125.     ASM_END
  126. }
  127.  
  128. #pragma mark *** 680x0 asm : 
  129. #elif USE_68K_ASSEMBLY
  130.  
  131. ASM_FUNC void BlitPixieClear(
  132.     unsigned char *dst,
  133.     unsigned long dstRowBytes,
  134.     unsigned short bytesPerRow,
  135.     unsigned short rows,
  136.     unsigned long clear )
  137. {
  138.     #define D_dstBytes        D2
  139.     #define D_bytes            D3
  140.  
  141.     ASM_BEGIN
  142.  
  143.     MOVEM.L      D3-D4/A2,-(SP)
  144.  
  145.     MOVE.L      clear,A0
  146.     MOVE.L      dst,A1
  147.     MOVE.L      dstRowBytes,D2
  148.     MOVE.W      bytesPerRow,D3
  149.     MOVE.W      rows,D4
  150.  
  151.     EXT.L      D_bytes
  152.     SUB.L      D_bytes,D_dstBytes
  153.      
  154.  //    *** LOOP SETUP ***
  155.     MOVEQ     #15,D0
  156.     CLR.L      D1
  157.  
  158.     MOVE.W    D_bytes,D1
  159.     LSR.W     #2,D1            //    / sizeof(long)
  160.     AND.W      D0,D1
  161.     ADD.W      D1,D1            //    * sizeof(MOVE.L (A0)+,(A1)+)
  162.     LEA          @loopend,A2
  163.     SUBA.L      D1,A2    
  164.  
  165.     MOVE.W    D_bytes,D1
  166.     LSR.W       #6,D1
  167.  
  168. // *** COPY ***
  169.  
  170. @rowloop:
  171.  
  172.              // align to word boundary
  173.             // main word copy loop
  174.         MOVE.W    D1,D0
  175.            JMP        (A2)
  176.    @loopstart:
  177.         MOVE.L    A0,(A1)+
  178.         MOVE.L     A0,(A1)+
  179.         MOVE.L    A0,(A1)+
  180.         MOVE.L     A0,(A1)+
  181.         MOVE.L    A0,(A1)+
  182.         MOVE.L    A0,(A1)+
  183.         MOVE.L    A0,(A1)+
  184.         MOVE.L     A0,(A1)+
  185.         MOVE.L    A0,(A1)+
  186.         MOVE.L    A0,(A1)+
  187.         MOVE.L     A0,(A1)+
  188.         MOVE.L    A0,(A1)+
  189.         MOVE.L    A0,(A1)+
  190.         MOVE.L    A0,(A1)+
  191.         MOVE.L     A0,(A1)+
  192.         MOVE.L    A0,(A1)+
  193.     @loopend:
  194.            DBRA    D0,@loopstart
  195.  
  196.               // do left-overs
  197.          MOVE.W    D_bytes,D0
  198.           ANDI.W    #2,D0
  199.           BEQ.S    @restword
  200.           MOVE.W    A0,(A1)+
  201.       @restword:
  202.         MOVE.W    D_bytes,D0
  203.           ANDI.W    #1,D0
  204.           BEQ.S    @restbyte
  205.       /*    MOVE.B    A0,(A1)+    */     dc.w 0x12C8 // <--- THINK won't let us ?
  206.       @restbyte:
  207.      
  208.     ADDA.L     D_dstBytes,A1
  209.  
  210.     SUBQ.W     #1,D4
  211.     BNE.S      @rowloop
  212.  
  213.     MOVEM.L      (SP)+,D3-D4/A2
  214.  
  215.     ASM_END
  216. }
  217.  
  218. #pragma mark *** Generic C : 
  219. #elif USE_GENERIC_C
  220.  
  221. void BlitPixieClear(
  222.     unsigned char *dst,
  223.     unsigned long dstRowBytes,
  224.     unsigned short bytes,
  225.     unsigned short rows,
  226.     unsigned long clear )
  227. {
  228.     BLITPIXIE_ASSERT(rows > 0 );
  229.     BLITPIXIE_ASSERT(bytes > 0 );
  230.     
  231.     while (rows--)
  232.     {
  233.         BlitPixieMemSet( dst, clear, bytes );
  234.         dst += dstRowBytes;
  235.     }
  236. }
  237.  
  238. #endif // GENERATING…
  239.  
  240.